#if defined(_WIN32)
#include <stdio.h>
#include <iostream>
#elif defined(__ANDROID__)
#include <android/log.h>
#elif defined(__linux__)
#include <stdio.h>
#include <iostream>
#endif

#define IMAGE_DEPTH_IO_ERROR 0x1
#define IMAGE_DEPTH_LOGIC_ERROR 0x2
#define IMAGE_DEPTH_UNIMPL_ERROR 0x3

#define IMAGE_DEPTH_LOG_TAG "IMAGE_DEPTH"

#ifndef PORTRAIT_MODEL_PATH
#define PORTRAIT_MODEL_PATH "/home/hiroki/portrait/model_converter"
#endif

#ifdef PERFORMANCE_ANALYSIS

#define TICK() cv::getTickCount()

#if defined(_WIN32)
#define IMAGE_DEPTH_LOGI(fmt, ...) fprintf(stdout, IMAGE_DEPTH_LOG_TAG " I: " fmt "\n", __VA_ARGS__)
#define IMAGE_DEPTH_LOGW(fmt, ...) fprintf(stdout, IMAGE_DEPTH_LOG_TAG " W: " fmt "\n", __VA_ARGS__)
#define IMAGE_DEPTH_LOGE(fmt, ...) fprintf(stdout, IMAGE_DEPTH_LOG_TAG " E: " fmt "\n", __VA_ARGS__)
#define ASSERT(cond, fmt, ...) { if(!(cond)){ fprintf(stdout, IMAGE_DEPTH_LOG_TAG " A: " fmt "\n", __VA_ARGS__); exit(-1); } }
#define FAIL_EXIT(code) {system("pause"); exit(code);}

#elif defined(__ANDROID__)
#define IMAGE_DEPTH_LOGI(...) __android_log_print(ANDROID_LOG_INFO, IMAGE_DEPTH_LOG_TAG, __VA_ARGS__)
#define IMAGE_DEPTH_LOGW(...) __android_log_print(ANDROID_LOG_WARN, IMAGE_DEPTH_LOG_TAG, __VA_ARGS__)
#define IMAGE_DEPTH_LOGE(...) __android_log_print(ANDROID_LOG_ERROR, IMAGE_DEPTH_LOG_TAG, __VA_ARGS__)
#define ASSERT(cond, fmt, ...) { if(!(cond)){ __android_log_assert(#cond, IMAGE_DEPTH_LOG_TAG, fmt, ##__VA_ARGS__);}}
#define FAIL_EXIT(code) {exit(code);}

#elif defined(__linux__)
#define IMAGE_DEPTH_LOGI(fmt, ...) fprintf(stdout, IMAGE_DEPTH_LOG_TAG " I: " fmt "\n", ##__VA_ARGS__)
#define IMAGE_DEPTH_LOGW(fmt, ...) fprintf(stdout, IMAGE_DEPTH_LOG_TAG " W: " fmt "\n", ##__VA_ARGS__)
#define IMAGE_DEPTH_LOGE(fmt, ...) fprintf(stdout, IMAGE_DEPTH_LOG_TAG " E: " fmt "\n", ##__VA_ARGS__)
#define ASSERT(cond, fmt, ...) { if(!(cond)){ fprintf(stdout, IMAGE_DEPTH_LOG_TAG " A: " fmt "\n", ##__VA_ARGS__); exit(-1); } }
#define FAIL_EXIT(code) {exit(code);}
#endif

#else // PERFORMANCE_ANALYSIS not defined

#define TICK() 0

#if defined(_WIN32)
#define IMAGE_DEPTH_LOGI(fmt, ...)
#define IMAGE_DEPTH_LOGW(fmt, ...)
#define IMAGE_DEPTH_LOGE(fmt, ...) fprintf(stdout, IMAGE_DEPTH_LOG_TAG " E: " fmt "\n", __VA_ARGS__)
#define ASSERT(cond, fmt, ...) { if(!(cond)){ fprintf(stdout, IMAGE_DEPTH_LOG_TAG " A: " fmt "\n", __VA_ARGS__); exit(-1); } }
#define FAIL_EXIT(code) {system("pause"); exit(code);}

#elif defined(__ANDROID__)
#define IMAGE_DEPTH_LOGI(...)
#define IMAGE_DEPTH_LOGW(...)
#define IMAGE_DEPTH_LOGE(...) __android_log_print(ANDROID_LOG_ERROR, IMAGE_DEPTH_LOG_TAG, __VA_ARGS__)
#define ASSERT(cond, fmt, ...) { if(!(cond)){ __android_log_assert(#cond, IMAGE_DEPTH_LOG_TAG, fmt, ##__VA_ARGS__);}}
#define FAIL_EXIT(code) {exit(code);}

#elif defined(__linux__)
#define IMAGE_DEPTH_LOGI(fmt, ...)
#define IMAGE_DEPTH_LOGW(fmt, ...)
#define IMAGE_DEPTH_LOGE(fmt, ...) fprintf(stdout, IMAGE_DEPTH_LOG_TAG " E: " fmt "\n", ##__VA_ARGS__)
#define ASSERT(cond, fmt, ...) { if(!(cond)){ fprintf(stdout, IMAGE_DEPTH_LOG_TAG " A: " fmt "\n", ##__VA_ARGS__); exit(-1); } }
#define FAIL_EXIT(code) {exit(code);}
#endif

#endif
